package com.ms.teapuesto.bean.support;

import com.ms.teapuesto.bean.EquipoBean;
import com.ms.teapuesto.domain.viewmodel.TeApuestoRsl;
import com.ms.teapuesto.util.NumberUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;

/**
 * Created by RAZANERO on 22/09/14.
 */
public class AnalisisUtil {
    private static final Logger LOG = LoggerFactory.getLogger(AnalisisUtil.class);
    EquipoBean local;
    EquipoBean visita;

    String resultadoSimple;
    String resultadoDoble;

    public AnalisisUtil() {
    }

    public void calcular(TeApuestoRsl teApuestoRsl, BigDecimal porcentaje) {
        LOG.info("Analizando "+teApuestoRsl.getTeams());
        double porcentaje_local = getPorcentajeLocal();
        double porcentaje_empate = getPorcentajeEmpate();
        double porcentaje_visita = getPorcentajeVisita();

        double porcentaje_local_ult_8 = getPorcentajeLocalUlt8();
        double porcentaje_empate_ult_8 = getPorcentajeEmpateUlt8();
        double porcentaje_visita_ult_8 = getPorcentajeVisitaUlt8();

        if(teApuestoRsl.getEventoBean().getResultadoLocal1t()==null) return;
        if (porcentaje_local >= porcentaje.doubleValue() && porcentaje_local_ult_8 >= porcentaje.doubleValue()
                || (porcentaje_local >= 50)) {
            resultadoSimple = "L";
        }
        if (porcentaje_empate >= porcentaje.doubleValue() && porcentaje_empate_ult_8 >= porcentaje.doubleValue()
                || (porcentaje_empate >= 50)) {
            resultadoSimple = "E";
        }
        if (porcentaje_visita >= porcentaje.doubleValue() && porcentaje_visita_ult_8 >= porcentaje.doubleValue()
                || (porcentaje_visita >= 50)) {
            resultadoSimple = "V";
        }

        if (StringUtils.isNotBlank(resultadoSimple)) {
            if (teApuestoRsl.getEventoBean().getResultadoLocal1t().doubleValue() >= porcentaje.doubleValue()
                    || teApuestoRsl.getEventoBean().getResultadoLocal1tUlt().doubleValue() >= porcentaje.doubleValue()) {
                resultadoDoble = "L";
            } else if (teApuestoRsl.getEventoBean().getResultadoEmpate1t().doubleValue() >= porcentaje.doubleValue()
                    || teApuestoRsl.getEventoBean().getResultadoEmpate1tUlt().doubleValue() >= porcentaje.doubleValue()) {
                resultadoDoble = "E";
            } else if (teApuestoRsl.getEventoBean().getResultadoVisita1t().doubleValue() >= porcentaje.doubleValue()
                    || teApuestoRsl.getEventoBean().getResultadoVisita1tUlt().doubleValue() >= porcentaje.doubleValue()) {
                resultadoDoble = "V";
            }
            if (StringUtils.isNotBlank(resultadoDoble)) {
                resultadoDoble += "/" + resultadoSimple;
            }

        }

        if (StringUtils.isBlank(resultadoSimple)) {
            try {
                if ((local.getLocal_avg_3().doubleValue() >= 0.5 || local.getLocal_avg_3_ult().doubleValue() >= 0.5)
                        || (visita.getVisita_avg_3().doubleValue() >= 0.5 || visita.getVisita_avg_3_ult().doubleValue() >= 0.5)) {
                    double totalPartidos = local.getLocal_partidos_ult() + visita.getVisita_partidos_ult();
                    BigDecimal localGolUlt = new BigDecimal(NumberUtil.nvl(local.getLocal_avg_scored_ult()).add(NumberUtil.nvl(visita.getVisita_avg_conceded_ult())).doubleValue() / totalPartidos);
                    BigDecimal visitaGolUlt = new BigDecimal(NumberUtil.nvl(visita.getVisita_avg_scored_ult()).add(NumberUtil.nvl(local.getLocal_avg_conceded_ult())).doubleValue() / totalPartidos);
                    totalPartidos = local.getLocal_partidos() + visita.getVisita_partidos();
                    BigDecimal localGol = new BigDecimal(NumberUtil.nvl(local.getLocal_avg_scored()).add(NumberUtil.nvl(visita.getVisita_avg_conceded())).doubleValue() / totalPartidos);
                    BigDecimal visitaGol = new BigDecimal(NumberUtil.nvl(visita.getVisita_avg_scored()).add(NumberUtil.nvl(local.getLocal_avg_conceded())).doubleValue() / totalPartidos);
                    if ((localGol.doubleValue() + visitaGol.doubleValue()) >= 3
                            || (localGolUlt.doubleValue() + visitaGolUlt.doubleValue()) >= 3) {
                        resultadoSimple = "+3";
                    }
                }

            } catch (Exception ex) {
                System.out.println("erro en " + local.getNombre() + visita.getNombre());
            }
        }


        if (StringUtils.isNotBlank(resultadoDoble)) {
            return;
        }

        double ll_ult8 = getPorcentajeLL();
        double le_ult8 = getPorcentajeLE();
        double lv_ult8 = getPorcentajeLV();
        double el_ult8 = getPorcentajeEL();
        double ee_ult8 = getPorcentajeEE();
        double ev_ult8 = getPorcentajeEV();
        double vl_ult8 = getPorcentajeVL();
        double ve_ult8 = getPorcentajeVE();
        double vv_ult8 = getPorcentajeVV();

        double inicio = 0;

        if ((StringUtils.isBlank(resultadoSimple) || "L".equals(resultadoSimple)) && ll_ult8 > inicio) {
            resultadoDoble = "L/L";
            inicio = ll_ult8;
        }

        if ((StringUtils.isBlank(resultadoSimple) || "E".equals(resultadoSimple)) && le_ult8 > inicio) {
            resultadoDoble = "L/E";
            inicio = le_ult8;
        }
        if ((StringUtils.isBlank(resultadoSimple) || "V".equals(resultadoSimple)) && lv_ult8 > inicio) {
            resultadoDoble = "L/V";
            inicio = lv_ult8;
        }
        if ((StringUtils.isBlank(resultadoSimple) || "L".equals(resultadoSimple)) && el_ult8 > inicio) {
            resultadoDoble = "E/L";
            inicio = el_ult8;
        }

        if ((StringUtils.isBlank(resultadoSimple) || "E".equals(resultadoSimple)) && ee_ult8 > inicio) {
            resultadoDoble = "E/E";
            inicio = ee_ult8;
        }

        if ((StringUtils.isBlank(resultadoSimple) || "V".equals(resultadoSimple)) && ev_ult8 > inicio) {
            resultadoDoble = "E/V";
            inicio = ev_ult8;
        }

        if ((StringUtils.isBlank(resultadoSimple) || "L".equals(resultadoSimple)) && vl_ult8 > inicio) {
            resultadoDoble = "V/L";
            inicio = vl_ult8;
        }

        if ((StringUtils.isBlank(resultadoSimple) || "E".equals(resultadoSimple)) && ve_ult8 > inicio) {
            resultadoDoble = "V/E";
            inicio = ve_ult8;
        }

        if ((StringUtils.isBlank(resultadoSimple) || "V".equals(resultadoSimple)) && vv_ult8 > inicio) {
            resultadoDoble = "V/V";
            inicio = vv_ult8;
        }

    }

    public AnalisisUtil(TeApuestoRsl teApuestoRsl, EquipoBean equipoLocal, EquipoBean equipoVisita, BigDecimal porcentaje) {
        this.local = equipoLocal;
        this.visita = equipoVisita;
        calcular(teApuestoRsl, porcentaje);
    }

    public int getTotalPartidos() {
        if (local.getLocal_partidos_ult() != null && visita.getVisita_partidos_ult() != null) {
            return local.getLocal_partidos_ult() + visita.getVisita_partidos_ult();
        }
        return 1000;
    }

    public int getPartidos() {
        if (local.getPartidos_ult_8() != null && visita.getPartidos_ult_8() != null) {
            return local.getPartidos_ult_8() + visita.getPartidos_ult_8();
        }
        return 1000;
    }

    public double getDifPosicion() {
        return Math.abs(local.getPosicion_ult_8() - visita.getPosicion_ult_8());
    }

    public double getPorcentajeLocal() {
        return (NumberUtil.nvl(local.getLocal_g_ult()).add(NumberUtil.nvl(visita.getVisita_p_ult()))).doubleValue() / getTotalPartidos() * 100;
    }

    public double getPorcentajeLocalUlt8() {
        if (local.getTotal_g_ult_8() == null || visita.getTotal_p_ult_8() == null) {
            return 0;
        }
        return ((local.getTotal_g_ult_8() + visita.getTotal_p_ult_8()) * 1.0 / (getPartidos()) * 100);
    }

    public double getPorcentajeEmpateUlt8() {
        if (local.getTotal_e_ult_8() == null || visita.getTotal_e_ult_8() == null) {
            return 0;
        }
        return ((local.getTotal_e_ult_8() + visita.getTotal_e_ult_8()) * 1.0 / (getPartidos()) * 100);
    }

    public double getPorcentajeVisitaUlt8() {
        if (local.getTotal_p_ult_8() == null || visita.getTotal_p_ult_8() == null) {
            return 0;
        }
        return ((local.getTotal_p_ult_8() + visita.getTotal_g_ult_8()) * 1.0 / (getPartidos()) * 100);
    }

    public double getPorcentajeEmpate() {
        return (NumberUtil.nvl(local.getLocal_e_ult()).add(NumberUtil.nvl(visita.getVisita_e_ult()))).doubleValue() / getTotalPartidos() * 100;
    }

    public double getPorcentajeVisita() {
        return (NumberUtil.nvl(local.getLocal_p_ult()).add(NumberUtil.nvl(visita.getVisita_g_ult()))).doubleValue() / getTotalPartidos() * 100;
    }

    public double getGolesLocal() {
        return (NumberUtil.nvl(local.getLocal_avg_scored_ult()).add(NumberUtil.nvl(visita.getVisita_avg_conceded_ult())).doubleValue()) / getPartidos();
    }

    public double getGolesVisita() {
        return (NumberUtil.nvl(visita.getVisita_avg_scored_ult()).add(NumberUtil.nvl(local.getLocal_avg_conceded_ult())).doubleValue()) / getPartidos();
    }

    public double getGolesLocalPT() {
        return (NumberUtil.nvl(local.getLocal_avg_scored_1t_ult()).add(NumberUtil.nvl(visita.getVisita_avg_conceded_1t_ult())).doubleValue()) / getPartidos();
    }

    public double getGolesVisitaPT() {
        return (NumberUtil.nvl(local.getLocal_avg_conceded_1t_ult()).add(NumberUtil.nvl(visita.getVisita_avg_scored_1t_ult())).doubleValue()) / getPartidos();
    }

    public double getPorcentajeLocalPTUlt8() {
        return (NumberUtil.nvl(local.getLocal_g_1t_ult()).add(NumberUtil.nvl(visita.getVisita_p_1t_ult())).doubleValue()) / getPartidos() * 100;
    }

    public double getPorcentajeEmpatePTUlt8() {
        return (NumberUtil.nvl(local.getLocal_e_1t_ult()).add(NumberUtil.nvl(visita.getVisita_e_1t_ult())).doubleValue()) / getPartidos() * 100;
    }

    public double getPorcentajeVisitaPTUlt8() {
        return (NumberUtil.nvl(local.getLocal_p_1t_ult()).add(NumberUtil.nvl(visita.getVisita_g_1t_ult())).doubleValue()) / getPartidos() * 100;
    }

    public double getPorcentajeVV() {
        return (NumberUtil.nvl(local.getLocal_vv()).add(NumberUtil.nvl(visita.getVisita_vv())).doubleValue()) / getPartidos() * 100;
    }

    public double getPorcentajeVL() {
        return NumberUtil.nvl(local.getLocal_vl()).add(NumberUtil.nvl(visita.getVisita_vl())).doubleValue() / getPartidos() * 100;
    }

    public double getPorcentajeVE() {
        return (NumberUtil.nvl(local.getLocal_ve()).add(NumberUtil.nvl(visita.getVisita_ve())).doubleValue()) / getPartidos() * 100;

    }

    public double getPorcentajeLL() {
        return (NumberUtil.nvl(local.getLocal_ll()).add(NumberUtil.nvl(visita.getVisita_ll())).doubleValue()) / getPartidos() * 100;
    }

    public double getPorcentajeLE() {
        return (NumberUtil.nvl(local.getLocal_le()).add(NumberUtil.nvl(visita.getVisita_le())).doubleValue()) / getPartidos() * 100;
    }

    public double getPorcentajeLV() {
        return NumberUtil.nvl(local.getLocal_lv()).add(NumberUtil.nvl(visita.getVisita_lv())).doubleValue() / getPartidos() * 100;
    }

    public double getPorcentajeEE() {
        return (NumberUtil.nvl(local.getLocal_ee()).add(NumberUtil.nvl(visita.getVisita_ee())).doubleValue()) / getPartidos() * 100;
    }

    public double getPorcentajeEL() {
        return (NumberUtil.nvl(local.getLocal_el()).add(NumberUtil.nvl(visita.getVisita_el())).doubleValue()) / getPartidos() * 100;
    }

    public double getPorcentajeEV() {
        return (NumberUtil.nvl(local.getLocal_ev()).add(NumberUtil.nvl(visita.getVisita_ev())).doubleValue()) / getPartidos() * 100;
    }

    public String getResultadoDoble() {
        return resultadoDoble;
    }

    public String getResultadoSimple() {
        return resultadoSimple;
    }
}
